Перейти к основному содержимому

2.08. Файерволлы

Всем

Файерволлы

От чего защищает файерволл и зачем он нужен

Файерволл обеспечивает защиту информационных систем от несанкционированного доступа, вредоносного сетевого трафика и попыток эксплуатации уязвимостей. Он служит первым рубежом обороны в архитектуре сетевой безопасности. Основная задача — контроль входящего и исходящего трафика на основе заранее определённых правил.

Файерволл предотвращает проникновение вредоносных программ, сканирование портов, атаки типа «отказ в обслуживании» (DoS), а также блокирует соединения с известными вредоносными IP-адресами или доменами. Он ограничивает возможности внутренних приложений устанавливать нежелательные внешние соединения, что снижает риски утечки данных или участия устройства в ботнетах.

Наличие файерволла особенно важно в условиях постоянной активности автоматизированных сканеров и ботов в интернете, которые постоянно ищут уязвимые системы для эксплуатации. Без файерволла каждое устройство в сети потенциально доступно для любого участника глобальной сети, что создаёт высокий уровень риска.

Что такое пакет данных

Пакет данных — это минимальная единица передачи информации в сетях, использующих протоколы семейства TCP/IP. При отправке данных по сети они разбиваются на фрагменты, каждый из которых упаковывается в пакет. Каждый пакет содержит:

  • Заголовок — служебную информацию: IP-адрес отправителя, IP-адрес получателя, номер порта источника, номер порта назначения, тип протокола (TCP, UDP, ICMP и другие), флаги управления, контрольную сумму.
  • Полезную нагрузку — часть исходных данных, предназначенных для передачи.
  • Концевик — дополнительные служебные данные, такие как CRC-контрольная сумма для проверки целостности.

Пакеты могут следовать по сети разными маршрутами и приходить в произвольном порядке. Получатель собирает их обратно в исходное сообщение с помощью информации из заголовков. Файерволлы анализируют содержимое заголовков пакетов, чтобы принимать решения о разрешении или блокировке трафика.

Пример структуры IP-пакета (упрощённо):

+-------------------------+
| Версия IP (4 или 6) |
| Длина заголовка |
| Тип сервиса |
| Общая длина пакета |
| Идентификатор |
| Флаги и смещение фрагмента|
| Время жизни (TTL) |
| Протокол |
| Контрольная сумма |
| IP-адрес источника |
| IP-адрес назначения |
+-------------------------+
| Порт источника (TCP/UDP)|
| Порт назначения |
| Номер последовательности|
| Подтверждение |
| Флаги (SYN, ACK и др.) |
+-------------------------+
| Полезная нагрузка |
+-------------------------+

Файерволл может работать на разных уровнях модели OSI, но чаще всего анализирует пакеты на сетевом (L3) и транспортном (L4) уровнях.

Как работают правила

Правила файерволла — это набор инструкций, определяющих, как обрабатывать сетевой трафик. Каждое правило состоит из условий и действия. Условия описывают характеристики трафика: IP-адреса, порты, протоколы, направление (входящий/исходящий), интерфейс, состояние соединения. Действие указывает, что делать с трафиком, соответствующим условиям: разрешить, запретить, перенаправить, залогировать.

Правила применяются последовательно, сверху вниз. При первом совпадении с трафиком выполняется соответствующее действие, и дальнейшая проверка прекращается. Это означает, что порядок правил имеет значение. Более специфичные правила должны располагаться выше общих.

Пример правила в формате iptables (Linux):

# Разрешить входящие соединения на порт 80 (HTTP)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

Это правило:

  • Применяется к цепочке INPUT (входящий трафик).
  • Работает с протоколом tcp.
  • Проверяет, что порт назначения (--dport) равен 80.
  • Если всё совпадает — действие ACCEPT (разрешить).

Другой пример — блокировка всех входящих соединений с конкретного IP:

iptables -A INPUT -s 192.168.5.100 -j DROP

Здесь:

  • -s указывает источник (source).
  • DROP означает полное игнорирование пакета без отправки ответа.

Правила могут быть временными (до перезагрузки) или постоянными (сохраняются в конфигурационных файлах). Эффективность правил зависит от их точности, полноты и логической согласованности.

Что такое фильтрация

Фильтрация — это процесс анализа сетевого трафика и принятия решений о его пропуске или блокировке на основе заданных критериев. Фильтрация реализуется через правила, описанные выше, и может происходить на разных уровнях детализации.

Существует несколько типов фильтрации:

  • Фильтрация по IP-адресу — разрешение или запрет трафика от/к определённым IP-адресам или подсетям. Например, разрешить доступ только с корпоративной сети 10.0.0.0/8.
  • Фильтрация по порту — контроль доступа к конкретным сетевым службам. Например, закрыть порт 22 (SSH) для всех, кроме администраторов.
  • Фильтрация по протоколу — ограничение использования определённых протоколов (например, запрет ICMP для предотвращения ping-сканирования).
  • Государственная (stateful) фильтрация — анализ не только отдельных пакетов, но и состояния всего соединения. Такой файерволл отслеживает, является ли пакет частью уже установленного легитимного соединения (например, ответ на запрос). Это позволяет блокировать случайные или поддельные пакеты, не относящиеся к реальным сессиям.
  • Контекстная фильтрация — более глубокий анализ, включающий содержимое прикладного уровня (L7). Например, блокировка HTTP-запросов, содержащих SQL-инъекции.

Фильтрация снижает поверхность атаки, минимизируя количество открытых и доступных сервисов. Она также помогает соблюдать принцип минимальных привилегий: система получает доступ только к тем ресурсам, которые ей действительно необходимы.

Как работает блокировка и разрешение

Блокировка и разрешение — это два основных действия, которые может выполнять файерволл в ответ на сетевой трафик.

Разрешение означает, что пакет пропускается дальше по сети. Это происходит, когда трафик соответствует одному из разрешающих правил. Разрешённый трафик может быть как входящим (например, запрос к веб-серверу), так и исходящим (например, обновление программного обеспечения).

Блокировка может реализовываться двумя способами:

  • DROP — пакет молча отбрасывается. Отправитель не получает никакого уведомления. Это повышает безопасность, так как злоумышленник не узнаёт, существует ли целевой хост или просто закрыт порт.
  • REJECT — отправляется сообщение об ошибке (например, ICMP-сообщение «порт недоступен» или TCP RST-пакет). Это удобнее для диагностики легитимных проблем, но даёт информацию потенциальному атакующему.

Выбор между DROP и REJECT зависит от политики безопасности. В публичных сервисах часто используется REJECT для удобства пользователей, а во внутренних сетях — DROP для маскировки инфраструктуры.

Пример конфигурации в nftables (современная замена iptables):

table inet filter {
chain input {
type filter hook input priority 0;
# Разрешить установленные соединения
ct state established,related accept
# Разрешить локальный трафик
iif "lo" accept
# Разрешить SSH
tcp dport 22 accept
# Блокировать всё остальное без уведомления
drop
}
}

Эта конфигурация:

  • Сначала пропускает уже установленные соединения.
  • Затем разрешает весь трафик на loopback-интерфейсе.
  • После этого открывает порт 22 для SSH.
  • Всё остальное — отбрасывается.

Такой подход («разрешить явно, всё остальное — запретить») считается наиболее безопасным.

Программный файерволл

Программный файерволл — это приложение или компонент операционной системы, реализующий функции межсетевого экрана на уровне хоста. Он работает внутри самой операционной системы и контролирует весь сетевой трафик, проходящий через сетевые интерфейсы этого устройства.

Преимущества программного файерволла:

  • Гибкость настройки под конкретное приложение или пользователя.
  • Возможность контроля исходящего трафика на уровне процессов.
  • Интеграция с другими компонентами ОС (например, с антивирусом).
  • Низкая стоимость — часто входит в состав ОС.

Недостатки:

  • Зависит от состояния операционной системы. Если ОС скомпрометирована, файерволл может быть отключён или обойдён.
  • Потребляет ресурсы CPU и памяти хоста.
  • Требует настройки на каждом устройстве отдельно.

Примеры программных файерволлов:

  • Windows Defender Firewall — встроен в Windows.
  • ufw (Uncomplicated Firewall) — упрощённый интерфейс к iptables в Linux.
  • pf — мощный файерволл в OpenBSD, также доступен в macOS и FreeBSD.
  • Firewalld — динамический менеджер фаерволла в современных дистрибутивах Linux (RHEL, Fedora, CentOS).

Пример команды в ufw:

# Разрешить порт 443 (HTTPS)
sudo ufw allow 443/tcp

Программный файерволл особенно полезен на конечных устройствах (ноутбуках, рабочих станциях), где важно контролировать, какие приложения могут выходить в интернет.

Аппаратный файерволл

Аппаратный файерволл — это специализированное сетевое устройство, предназначенное исключительно для выполнения функций межсетевого экрана. Он размещается на границе между внутренней сетью и внешним миром (например, между локальной сетью и интернетом).

Особенности аппаратного файерволла:

  • Выполняет фильтрацию на выделенном оборудовании с оптимизированной прошивкой.
  • Обеспечивает высокую производительность и низкую задержку.
  • Часто включает дополнительные функции: VPN, IDS/IPS, фильтрацию контента, QoS.
  • Управляется централизованно, что упрощает администрирование крупных сетей.
  • Не зависит от состояния конечных хостов.

Примеры аппаратных решений:

  • Cisco ASA / Firepower
  • Palo Alto Networks PA-Series
  • Fortinet FortiGate
  • Juniper SRX

Аппаратные файерволлы используются в корпоративных сетях, дата-центрах и провайдерских инфраструктурах. Они обеспечивают защиту всей сети сразу, а не по отдельным узлам.

Конфигурация аппаратного файерволла обычно выполняется через веб-интерфейс, CLI или API. Пример правила в Cisco ASA:

access-list OUTSIDE_IN extended permit tcp any host 203.0.113.10 eq 80
access-group OUTSIDE_IN in interface outside

Это правило разрешает любой входящий TCP-трафик на порт 80 хоста 203.0.113.10.

Аппаратные файерволлы часто поддерживают отказоустойчивость (HA-пары), глубокую инспекцию пакетов (DPI) и интеграцию с системами управления безопасностью (SIEM).


Брандмауэр Windows

Брандмауэр Windows — это встроенный компонент операционной системы Microsoft Windows, предназначенный для контроля входящего и исходящего сетевого трафика на уровне хоста. Он доступен во всех современных версиях Windows, начиная с Windows XP SP2, и активирован по умолчанию.

Брандмауэр Windows работает на основе профилей сети:

  • Домашняя сеть — применяется, когда компьютер подключён к доверенной локальной сети.
  • Частная сеть — используется в корпоративных или учебных сетях, где требуется баланс между безопасностью и функциональностью.
  • Публичная сеть — самый строгий профиль, применяемый при подключении к общественным Wi-Fi (кафе, аэропорты), где по умолчанию блокируются почти все входящие соединения.

Каждое правило может быть привязано к одному или нескольким профилям. Это позволяет гибко настраивать поведение в зависимости от контекста подключения.

Правила в брандмауэре Windows делятся на два типа:

  • Правила для программ — разрешают или запрещают конкретному исполняемому файлу (например, chrome.exe) создавать сетевые соединения.
  • Правила для портов — управляют трафиком по протоколам и номерам портов (например, разрешить TCP-порт 3389 для удалённого рабочего стола).

Пример создания правила через PowerShell:

# Разрешить входящие соединения на порт 8080 (TCP)
New-NetFirewallRule -DisplayName "Разрешить HTTP-альтернативу" `
-Direction Inbound `
-Protocol TCP `
-LocalPort 8080 `
-Action Allow

Это правило:

  • Имеет понятное имя (DisplayName).
  • Применяется ко входящему трафику (Inbound).
  • Работает только с протоколом TCP.
  • Слушает локальный порт 8080.
  • Выполняет действие Allow.

Брандмауэр Windows также поддерживает расширенные функции:

  • Фильтрацию по IP-адресам источника и назначения.
  • Управление правилами групповой политикой (GPO) в доменах Active Directory.
  • Интеграцию с IPsec для шифрования и аутентификации трафика.
  • Ведение журналов событий (по умолчанию отключено, но может быть включено вручную).

Журналы записываются в файл %systemroot%\System32\LogFiles\Firewall\pfirewall.log и содержат информацию о заблокированных и разрешённых пакетах, включая временные метки, IP-адреса, порты и протоколы.

Как настроить брандмауэр

Настройка файерволла зависит от используемой операционной системы или устройства. В общем случае процесс включает определение требуемых сетевых служб, создание правил для их работы и блокировку всего остального.

В Linux с использованием ufw (Uncomplicated Firewall):

# Включить файерволл
sudo ufw enable

# Разрешить SSH
sudo ufw allow OpenSSH

# Разрешить HTTP и HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# Запретить всё остальное по умолчанию
sudo ufw default deny incoming
sudo ufw default allow outgoing

В Windows через графический интерфейс:

  1. Открыть «Панель управления» → «Система и безопасность» → «Брандмауэр Защитника Windows».
  2. Выбрать «Дополнительные параметры».
  3. В разделе «Правила для входящих подключений» нажать «Создать правило».
  4. Указать тип правила (программа, порт, предопределённое).
  5. Выбрать действие (разрешить, разрешить с защитой, запретить).
  6. Назначить профили сети.
  7. Указать имя правила.

В macOS используется встроенный файерволл pf, управляемый через pfctl или графический интерфейс:

  • Системные настройки → «Сеть» → «Брандмауэр».
  • Можно включить базовую фильтрацию приложений.
  • Для продвинутой настройки редактируется файл /etc/pf.conf.

На маршрутизаторах (например, на базе OpenWrt) правила задаются через веб-интерфейс LuCI или напрямую в конфигурационных файлах iptables/nftables.

Общие принципы настройки:

  • Начинать с политики «запретить всё, разрешить явно».
  • Минимизировать количество открытых портов.
  • Ограничивать доступ по IP-адресам, где возможно.
  • Регулярно проверять и чистить устаревшие правила.

Как настроить исключения

Исключения — это правила, которые временно или постоянно отменяют действие основной политики файерволла для конкретных приложений, портов или адресов.

В Windows исключение можно добавить так:

  • Через PowerShell:
    # Разрешить конкретную программу
    New-NetFirewallRule -DisplayName "Моя программа" `
    -Program "C:\MyApp\app.exe" `
    -Direction Outbound `
    -Action Allow
  • Через графический интерфейс: при создании правила выбрать «Программа» → указать путь к .exe.

В Linux с iptables:

# Разрешить исходящие соединения к DNS-серверу Google
iptables -A OUTPUT -p udp --dport 53 -d 8.8.8.8 -j ACCEPT

В nftables:

table inet filter {
chain output {
ip daddr 8.8.8.8 udp dport 53 accept
}
}

Важно помнить:

  • Исключения увеличивают поверхность атаки.
  • Каждое исключение должно быть обосновано бизнес- или технической необходимостью.
  • Исключения для целых подсетей (0.0.0.0/0) считаются плохой практикой.
  • Лучше использовать временные исключения с автоматическим удалением (например, через cron или задачи планировщика).

Некоторые файерволлы поддерживают «динамические» исключения — например, при первом запуске программы пользователю предлагается разрешить или запретить сетевой доступ. Такой подход удобен для конечных пользователей, но не рекомендуется на серверах.

Как понять, что у программы, сервера или приложения проблемы именно из-за файервола

Диагностика проблем, связанных с файерволлом, начинается с наблюдения за симптомами:

  • Приложение не может подключиться к внешнему сервису (например, не загружает данные из интернета).
  • Сервер принимает локальные запросы (localhost), но недоступен извне.
  • Соединение зависает без ошибки или завершается с тайм-аутом.
  • Появляются сообщения вида «Connection refused» (если используется REJECT) или полное отсутствие ответа (если используется DROP).

Методы диагностики:

1. Проверка локальной доступности
Запустить сервер и попробовать подключиться к нему с того же хоста:

curl http://localhost:8080

Если работает — проблема во внешнем доступе, вероятно, в файерволле.

2. Проверка состояния порта с другого устройства
Использовать telnet, nc (netcat) или Test-NetConnection (PowerShell):

Test-NetConnection example.com -Port 8080

Если соединение не устанавливается, а сервер точно запущен — скорее всего, порт закрыт файерволлом.

3. Анализ журналов файерволла
Включить логирование и найти записи о блокировке:

  • В Windows: просмотреть pfirewall.log.
  • В Linux: проверить /var/log/kern.log или настроить отдельный лог для iptables:
    iptables -A INPUT -j LOG --log-prefix "BLOCKED: "

4. Временное отключение файерволла
(Только в тестовой среде!)

  • Windows:
    Set-NetFirewallProfile -Profile Domain,Private,Public -Enabled False
  • Linux:
    sudo ufw disable
    # или
    sudo iptables -P INPUT ACCEPT && sudo iptables -F

Если после отключения проблема исчезает — причина точно в правилах файерволла.

5. Проверка правил
Убедиться, что правило существует и активно:

  • Windows:
    Get-NetFirewallRule -DisplayName "Моё правило"
  • Linux:
    sudo iptables -L -n -v
    # или
    sudo nft list ruleset

Типичные ошибки:

  • Правило создано для неправильного профиля сети (например, только для «частной», а подключение публичное).
  • Указан неверный протокол (TCP вместо UDP или наоборот).
  • Порт указан как «локальный», хотя нужно разрешить «удалённый» (или наоборот).
  • Правило находится ниже более общего правила с действием DROP.

Когда диагноз подтверждён, создаётся точное правило, разрешающее нужный трафик, и файерволл возвращается в рабочее состояние.